/**
 * @Description:摄像头控件
 * 属性
 * @param height 设置播放器的高 ，不写默认300px
 * @param width 设置播放器的宽，不写默认450px
 *
 * @function setPlayInfo() 设置播放信息
 *
 * @Copyright: 成都和为科技有限公司 2017
 */
function VideoN() {
}

VideoN.inherit(Control);

VideoN.prototype.init = function () {
    VideoN.base.init.call(this);
}

/**
 * 初始化监控控件
 */
VideoN.prototype.initLoad = function () {
    this.createParam();
    this.initLayout();
    this.videoCallback();
    this.pressEsc();
}

/**
 * 创建参数列表
 */
VideoN.prototype.createParam = function () {
    this.initParam = {
        "初始化参数": {"服务器地址": "", "清晰度": 1, "名称": ""},
        "窗口能力": {"允许关闭": true, "允许截图": true, "允许录像": true, "允许声音": true, "允许云台": true, "允许回放": true}
    };
    this.videoParam = {
        "视频参数": {
            "名称": "",
            "编码": "",
            "通道号": "",
            "设备号": "",
            "云台速度": 7,
            "设备参数": {
                "IP地址": "",
                "网络端口": "",
                "用户名": "",
                "口令": "",
                "资源编号": ""
            }
        }, "插件类型编号": ""
    };
}

/**
 * 创建设备控件
 */
VideoN.prototype.create = function () {
    this._videoid = Math.uuid();
    this.videopluginid = Math.uuid();
    var _html = '<div class="videoplugin">';
    _html += '<div id="' + this.videopluginid + '" class="videoplugind">';
    _html += '<object id="' + this._videoid + '" isZoomIn=false type="application/x-videoplayer" border="2px" videostate="{"视频模式":"实时","播放状态":"正在播放","声音状态":"关闭","录像状态":"未录像","全屏状态":"未全屏"}">';
    _html += '<param name="onload" value="pluginLoaded" />';
    _html += '</object>';
    _html += '</div>';
    _html += '</div>';
    this._html = $(_html)[0];
    this.plugin = $('object', this._html)[0];
}

/**
 * 初始化窗口大小
 */
VideoN.prototype.initLayout = function () {
    var _control = $(this)[0];
    if (_control._attr.width == undefined) {
        _control._attr.width = "450px";
    }
    if (_control._attr.height == undefined) {
        _control._attr.height = "300px";
    }
    var _oldcss = {
        "width": _control._attr.width,
        "height": _control._attr.height
    };
    $(this.plugin).parent().parent().attr(_oldcss);
    $(this.plugin).parent().attr(_oldcss);
    $(this.plugin).attr(_oldcss);
}

/**
 *初始化播放参数
 */
VideoN.prototype.initPlay = function () {
    this.plugin.init(JSON.stringify(this.initParam), JSON.stringify(this.videoParam));
}

/**
 * 注册回调函数
 */
VideoN.prototype.videoCallback = function () {
    this.plugin.videoCallBack("callback", this._videoid);
}


/**
 *回调函数: *@param[in] type:1-关闭，2-选中，3-双击(放大/缩小)
 */
function callback(type, tmpPlugin,status) {
    debugger
    var plugin = document.getElementById(tmpPlugin);
    switch (type) {
        case 0://初始化成功后开始播放
            plugin.startPlayer();
            break;
        case 1: //关闭
            VideoN.prototype.delVideoByObj(tmpPlugin);
            break;
        case 2: //选中
            plugin.style.borderColor = "red";
            break;
        case 3://双击(放大/缩小)
            if ($(plugin).attr("isZoomIn") == "true") {
                VideoN.prototype.zoomMid(tmpPlugin);
            } else {
                VideoN.prototype.zoomIn(tmpPlugin);
            }
            break;
        case 4: //状态返回

            break;
    }
}

/**
 * 注册事件
 * @param obj   注册对象
 * @param name 事件名
 * @param func 回调
 */
VideoN.prototype.addEvent = function (obj, name, func) {
    if (obj.attachEvent) {
        obj.attachEvent("on" + name, func);
    } else {
        obj.addEventListener(name, func, false);
    }
}

/**
 * 绑定页面销毁事件
 */
VideoN.bindWindowDestroy = function (_window) {
    $(_window).bind('beforeunload', function () {
        $("body").find(".videoplugin").each(function () {
            var _videoid = $(this).find("object")[0].id;
            if (_videoid) {
                VideoN.prototype.delVideoByObj(_videoid);
            }
        });
    });
}


/**
 * 删除摄像头
 */
VideoN.prototype.delVideo = function (tmpPlugin) {
    this.delVideoByObj(tmpPlugin);
}

/**
 * 删除控件
 */
VideoN.prototype.delVideoByObj = function (tmpPlugin) {
    debugger
    var plugin;
    if (tmpPlugin) {
        plugin = document.getElementById(tmpPlugin);
    } else {
        plugin = this.plugin;
    }
    try {
        plugin.closeVideoProcess();
        $(plugin).parent().parent().remove();
        VideoN.log("销毁元素");
    } catch (e) {
        VideoN.log("销毁元素失败");
    }
}

/**
 * 全屏
 * tmpPlugin 控件ID
 */
VideoN.prototype.zoomIn = function (tmpPlugin) {
    var plugin;
    if (tmpPlugin) {
        plugin = document.getElementById(tmpPlugin);
    } else {
        plugin = this.plugin;
    }
    var _html = $(plugin);
    var _width = document.documentElement.clientWidth;
    var _height = document.documentElement.clientHeight;
    var _newcss = {
        "position": "fixed",
        "left": "0px",
        "top": "0px",
        "z-index": 9999
    };

    _html.css(_newcss);
    _html.height(_height).width(_width);
    $(plugin).attr("isZoomIn", "true");
    // 在qt上特殊处理
    if (typeof(g_sSession) != "undefined") {
        qtwebobject.exec("special_esc", 4);
    }
}


/**
 * 还原
 * tmpPlugin 控件ID
 */
VideoN.prototype.zoomMid = function (tmpPlugin) {
    var plugin;
    if (tmpPlugin) {
        plugin = document.getElementById(tmpPlugin);
    } else {
        plugin = this.plugin;
    }
    var _html = $(".videoplugind", $(plugin).parent().parent().parent()[0]);
    if (_html.attr("width") == undefined) {
        _html.attr("width", "450px");
    }
    if (_html.attr("height") == undefined) {
        _html.attr("height", "300px");
    }
    var _oldcss = {
        "width": _html.attr("width"),
        "height": _html.attr("height"),
        "z-index": 0
    };
    $(plugin).removeAttr("style");
    $(plugin).css(_oldcss);
    $(plugin).attr("isZoomIn", "false");
    // 在qt上特殊处理
    if (typeof(g_sSession) != "undefined") {
        qtwebobject.exec("special_esc", 4);
    }
}

/**
 * 监听键盘Esc退出全屏
 */
VideoN.prototype.pressEsc = function () {
    $(document).keydown(function (event) {
        if (event.keyCode == 27) {
            this.zoomMid;
        }
    });
}


/**
 * 开始实时播放
 */
VideoN.prototype.startVideo = function () {
    //alert("开始实时播放：摄像头名称：" + this.videoParam.视频参数.名称 + " -- 地址：" + this.videoParam.视频参数.设备参数.IP地址);
    try {
        this.initPlay();
        VideoN.log("开始实时播放：摄像头名称：" + this.videoParam.视频参数.名称 + " -- 地址：" + this.videoParam.视频参数.设备参数.IP地址);
        VideoN.prototype.saveLog({
            title: "视频信息",
            method: "实时播放",
            playUrl: this.videoParam.视频参数.设备参数.IP地址
        });
    } catch (e) {
        VideoN.log("开始实时播放失败");
    }
}

/**
 * 停止实时播放
 */
VideoN.prototype.stopVideo = function () {
    try {
        this.plugin.stopPlayer();
        VideoN.log("停止实时播放：摄像头名称：" + this.videoParam.视频参数.名称 + " -- 地址：" + this.videoParam.视频参数.设备参数.IP地址);
    } catch (e) {
        VideoN.log("停止实时播放失败");
    }
}

/**
 * 开始历史回放
 * startTime 回放开始时间  时间戳
 * endTime  回放结束时间   时间戳
 */
VideoN.prototype.startHistory = function (startTime, endTime) {
    try {
        this.plugin.startHistory(startTime, endTime);
        var _stime = DateTime.getDateTimeSecondsString(new Date(startTime * 1000));
        var _etime = DateTime.getDateTimeSecondsString(new Date(endTime * 1000));
        VideoN.log("开始历史播放，从" + _stime + "开始到" + _etime + "结束");
        this.saveLog({
            title: "视频信息",
            method: "历史播放",
            playUrl: this.videoParam.视频参数.设备参数.IP地址
        });
    } catch (e) {
        VideoN.log("开始历史播放失败");
    }
}

/**
 * 结束历史回放
 */
VideoN.prototype.stopHistory = function () {
    try {
        this.plugin.stopHistory();
        VideoN.log("停止历史播放：摄像头名称：" + this.videoParam.视频参数.名称 + " -- 地址：" + this.videoParam.视频参数.设备参数.IP地址);
    } catch (e) {
        VideoN.log("停止历史播放失败");
    }
}

/**
 * 暂停回放
 * tmpPlugin 控件ID
 */
VideoN.prototype.pauseHistory = function () {
    try {
        this.plugin.pauseHistory();
        VideoN.log("暂停历史播放：摄像头名称：" + this.videoParam.视频参数.名称 + " -- 地址：" + this.videoParam.视频参数.设备参数.IP地址);
    } catch (e) {
        VideoN.log("暂停历史播放失败");
    }
}

/**
 *恢复回放
 */
VideoN.prototype.restartHistory = function () {
    try {
        this.plugin.resumeHistory();
        VideoN.log("重新开发历史回放：摄像头名称：" + this.videoParam.视频参数.名称 + " -- 地址：" + this.videoParam.视频参数.设备参数.IP地址);
    } catch (e) {
        VideoN.log("重新开发历史回放失败");
    }
}

/**
 * 快速回放
 * tmpPlugin 控件ID
 */
VideoN.prototype.fastHistory = function () {
    try {
        this.plugin.fastHistory();
        VideoN.log("快速回放：摄像头名称：" + this.videoParam.视频参数.名称 + " -- 地址：" + this.videoParam.视频参数.设备参数.IP地址);
    } catch (e) {
        VideoN.log("快速回放失败");
    }
}

/**
 *慢速回放
 */
VideoN.prototype.slowHistory = function () {
    try {
        this.plugin.slowHistory();
        VideoN.log("快速回放：摄像头名称：" + this.videoParam.视频参数.名称 + " -- 地址：" + this.videoParam.视频参数.设备参数.IP地址);
    } catch (e) {
        VideoN.log("快速回放失败");
    }
}

/**
 *拖拽回放
 * dragTime  拖拽播放时间  时间戳
 */
VideoN.prototype.dragPlay = function (dragTime) {
    try {
        this.plugin.dragPlay(dragTime);
        var _time = DateTime.getDateTimeSecondsString(new Date(dragTime * 1000));
        VideoN.log("历史播放，" + _time);
    } catch (e) {
        VideoN.log("拖拽播放失败");
    }
}

/**
 * 截图
 */
VideoN.prototype.printRecord = function () {
    try {
        this.plugin.screenshot();
        this.saveLog({
            title: "视频信息",
            method: "视频截图",
            playUrl: this.videoParam.视频参数.设备参数.IP地址
        });
    } catch (e) {
        VideoN.log("截屏失败");
    }
}

/**
 * 开始录像
 * tmpPlugin 控件ID
 */
VideoN.prototype.startRecord = function () {
    try {
        this.plugin.startVideoTape();
        this.saveLog({
            title: "视频信息",
            method: "视频录像",
            playUrl: this.videoParam.视频参数.设备参数.IP地址
        });
    } catch (e) {
        VideoN.log("录像失败");
    }
}

/**
 * 停止录像
 */
VideoN.prototype.stopRecord = function () {
    try {
        this.plugin.stopVideoTape();
    } catch (e) {
        VideoN.log("停止录像失败");
    }
}

/**
 * 设置路劲
 */
VideoN.prototype.setSaveDataPath = function (videopath, photopath) {
    try {
        this.plugin.setSaveDataPath(videopath, photopath);
    } catch (e) {
        VideoN.log("设置保存路径失败！");
    }
}


/**
 * 设置播放信息
 */
VideoN.prototype.setValue = function (value, data) {
    if (value == "")
        return;
    this.setPlayInfo(value, data);
    this.startVideo();
}

/**
 * 获取播放地址
 */
VideoN.prototype.getValue = function () {
    //需要修改
    return this.videoParam.视频参数.设备参数.IP地址;
}

/**
 * 设置摄像头的播放信息
 */
VideoN.prototype.setPlayInfo = function (value, data) {
    var results = this.getVideoParam(value);
    if (!results || !results.result) {
        return;
    }
    var result = results.result;
    if (data && data["name"] != undefined) {
        this.initParam.初始化参数.名称 = data.name;
        this.videoParam.视频参数.名称 = data.name;
    }
    if (result.参数表.视频参数["通道号"] != undefined) {
        this.videoParam.视频参数.通道号 = result.参数表.视频参数.通道号;
    }
    if (result.参数表.视频参数["编码"] != undefined) {
        this.videoParam.视频参数.编码 = result.参数表.视频参数.编码;
    }
    if (result.参数表.视频参数["设备号"] != undefined) {
        this.videoParam.视频参数.设备号 = result.参数表.视频参数.设备号;
    }
    if (result.参数表.视频参数["DVR参数"] != undefined) {
        this.videoParam.视频参数.设备参数.IP地址 = result.参数表.视频参数.DVR参数.IP地址;
        this.videoParam.视频参数.设备参数.网络端口 = result.参数表.视频参数.DVR参数.网络端口;
        this.videoParam.视频参数.设备参数.用户名 = result.参数表.视频参数.DVR参数.用户名;
        this.videoParam.视频参数.设备参数.口令 = result.参数表.视频参数.DVR参数.口令;
        this.videoParam.视频参数.设备参数.资源编号 = result.参数表.视频参数.DVR参数.资源编号;
    } else if (result.参数表.视频参数["DVS参数"] != undefined) {
        this.videoParam.视频参数.设备参数.IP地址 = result.参数表.视频参数.DVS参数.系统IP地址;
        this.videoParam.视频参数.设备参数.网络端口 = result.参数表.视频参数.DVS参数.网络端口;
        this.videoParam.视频参数.设备参数.用户名 = result.参数表.视频参数.DVS参数.用户名;
        this.videoParam.视频参数.设备参数.口令 = result.参数表.视频参数.DVS参数.口令;
        this.videoParam.视频参数.设备参数.资源编号 = result.参数表.视频参数.DVS参数.资源编号;
    } else if (result.参数表.视频参数["NVR参数"] != undefined) {
        this.videoParam.视频参数.设备参数.IP地址 = result.参数表.视频参数.NVR参数.IP地址;
        this.videoParam.视频参数.设备参数.网络端口 = result.参数表.视频参数.NVR参数.网络端口;
        this.videoParam.视频参数.设备参数.用户名 = result.参数表.视频参数.NVR参数.用户名;
        this.videoParam.视频参数.设备参数.口令 = result.参数表.视频参数.NVR参数.口令;
        this.videoParam.视频参数.设备参数.资源编号 = result.参数表.视频参数.NVR参数.资源编号;
    } else {
        alert("播放失败，未知的视频参数！");
    }
    if (result.参数表["插件类型编号"] != undefined) {
        this.videoParam.插件类型编号 = result.参数表.插件类型编号;
    }
}

/**
 * 获取摄像头的播放信息
 */
VideoN.prototype.getPlayInfo = function () {
    var data = {};
    data.initParam = this.initParam;
    data.videoParam = this.videoParam;
    return data;
}


/**
 * 修改播放窗口大小
 */
VideoN.prototype.updateWndSize = function (width, height) {
    var _newcss = {
        "width": width,
        "height": height
    };
    $(this.plugin).parent().parent().attr(_newcss);
    $(this.plugin).parent().attr(_newcss);
    $(this.plugin).attr(_newcss);
}

/**
 * 设置播放窗口
 */
VideoN.prototype.createPlayerWnd = function (width, height) {
    this.updateWndSize(width, height);
}

/**
 * 获取视频播放参数
 * @param id
 * @returns {*}
 */
VideoN.prototype.getVideoParam = function (id) {
    if (!id) return "";
    var soap = new HWSOAP("/videomonitor/getVideoParam.do");
    soap.send({id: id});
    var result = soap.getResult();
    return result;
}

/**
 * 停止播放
 */
VideoN.prototype.stop = function () {
    this.stopHistory();
}

/**
 * 播放
 */
VideoN.prototype.play = function () {
    this.restartHistory();
}

/**
 * 暂停
 */
VideoN.prototype.pause = function () {
    this.pauseHistory();
}


/**
 * 打印日志
 */
VideoN.log = function (value) {
    if (typeof(console) != 'undefined') {
        console.log(value);
    }
}

/**
 * 保存日志
 */
VideoN.prototype.saveLog = function (value) {
    var soap = new HWSOAP("./videomonitor/videoOperLog.do");
    soap.send({
        params: JSON.stringify(value)
    });
}

/**
 * 得到服务器现在时间(秒)
 */
VideoN.prototype.getNowTime = function () {
    var _date = DateTime.getDateTime();
    return VideoN.getTime(_date);
}

/**
 * 得到时间(秒)
 */
VideoN.prototype.getTime = function (time) {
    var _year = time.substring(0, 4) - 0;
    var _month = time.substring(5, 7) - 1;
    var _day = time.substring(8, 10) - 0;
    var _hour = time.substring(11, 13) - 0;
    var _minute = time.substring(14, 16) - 0;
    var _second = time.substring(17, 19) - 0;

    var _date = new Date(_year, _month, _day, _hour, _minute, _second);

    return Math.round(_date.getTime() / 1000);
}

